{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "u3Zq5VrfiDqB"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Probability Authors.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "3jTEqPzFiHQ0"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\"); { display-mode: \"form\" }\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "x97n3SaNmNpB"
      },
      "source": [
        "# Fitting Generalized Linear Mixed-effects Models Using Variational Inference\n",
        "\n",
        "\u003ctable class=\"tfo-notebook-buttons\" align=\"left\"\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://www.tensorflow.org/probability/examples/Linear_Mixed_Effects_Model_Variational_Inference\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" /\u003eView on TensorFlow.org\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Model_Variational_Inference.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" /\u003eRun in Google Colab\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca target=\"_blank\" href=\"https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Model_Variational_Inference.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" /\u003eView source on GitHub\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "  \u003ctd\u003e\n",
        "    \u003ca href=\"https://storage.googleapis.com/tensorflow_docs/probability/tensorflow_probability/examples/jupyter_notebooks/Linear_Mixed_Effects_Model_Variational_Inference.ipynb\"\u003e\u003cimg src=\"https://www.tensorflow.org/images/download_logo_32px.png\" /\u003eDownload notebook\u003c/a\u003e\n",
        "  \u003c/td\u003e\n",
        "\u003c/table\u003e"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "0GVst7yy6Aww"
      },
      "source": [
        "## Abstract\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Lt4RS9whJhQh"
      },
      "source": [
        "In this colab we demonstrate how to fit a Generalized Linear Mixed-effects Model using Variational Inference and TensorFlow.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "0-lfIBVAzi7D"
      },
      "source": [
        "## Model Family"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "ljSRsKrXwqb6"
      },
      "source": [
        "[Generalized linear mixed-effect models](https://en.wikipedia.org/wiki/Generalized_linear_mixed_model) (GLMM) are similar to [generalized linear models](https://en.wikipedia.org/wiki/Generalized_linear_model) (GLM) except that they incorporate a sample specific noise into the predicted linear response.  This is useful in part because it allows rarely seen features to share information with more commonly seen features.\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "H-B38entvltq"
      },
      "source": [
        "As a generative process, a Generalized Linear Mixed-effects Model (GLMM) is characterized by:\n",
        "\n",
        "$$\n",
        "\\begin{align}\n",
        "\\text{for } \u0026 r = 1\\ldots R:  \\hspace{2.45cm}\\text{# for each random-effect group}\\\\\n",
        " \u0026\\begin{aligned}\n",
        "  \\text{for } \u0026c = 1\\ldots |C_r|:  \\hspace{1.3cm}\\text{# for each category (\"level\") of group $r$}\\\\\n",
        "  \u0026\\begin{aligned}\n",
        "    \\beta_{rc}\n",
        "    \u0026\\sim \\text{MultivariateNormal}(\\text{loc}=0_{D_r}, \\text{scale}=\\Sigma_r^{1/2})\n",
        "  \\end{aligned}\n",
        "\\end{aligned}\\\\\\\\\n",
        "\\text{for } \u0026 i = 1 \\ldots N:  \\hspace{2.45cm}\\text{# for each sample}\\\\\n",
        "\u0026\\begin{aligned}\n",
        "  \u0026\\eta_i = \\underbrace{\\vphantom{\\sum_{r=1}^R}x_i^\\top\\omega}_\\text{fixed-effects} + \\underbrace{\\sum_{r=1}^R z_{r,i}^\\top \\beta_{r,C_r(i) }}_\\text{random-effects} \\\\\n",
        "  \u0026Y_i|x_i,\\omega,\\{z_{r,i} , \\beta_r\\}_{r=1}^R \\sim \\text{Distribution}(\\text{mean}= g^{-1}(\\eta_i))\n",
        "\\end{aligned}\n",
        "\\end{align}\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "3gZmFJXAHwfy"
      },
      "source": [
        "where:\n",
        "\n",
        "$$\n",
        "\\begin{align}\n",
        "R \u0026= \\text{number of random-effect groups}\\\\\n",
        "|C_r| \u0026= \\text{number of categories for group $r$}\\\\\n",
        "N \u0026= \\text{number of training samples}\\\\\n",
        "x_i,\\omega \u0026\\in \\mathbb{R}^{D_0}\\\\\n",
        "D_0 \u0026= \\text{number of fixed-effects}\\\\\n",
        "C_r(i) \u0026= \\text{category (under group $r$) of the $i$th sample}\\\\\n",
        "z_{r,i} \u0026\\in \\mathbb{R}^{D_r}\\\\\n",
        "D_r \u0026= \\text{number of random-effects associated with group $r$}\\\\\n",
        "\\Sigma_{r} \u0026\\in \\{S\\in\\mathbb{R}^{D_r \\times D_r} : S \\succ 0 \\}\\\\\n",
        "\\eta_i\\mapsto g^{-1}(\\eta_i) \u0026= \\mu_i, \\text{inverse link function}\\\\\n",
        "\\text{Distribution} \u0026=\\text{some distribution parameterizable solely by its mean}\n",
        "\\end{align}\n",
        "$$\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "5AYonR45P1Hr"
      },
      "source": [
        "In words, this says that every category of each group is associated with an iid MVN, $\\beta_{rc}$. Although the $\\beta_{rc}$ draws are always independent, they are only indentically distributed for a group $r$; notice there is exactly one $\\Sigma_r$ for each $r\\in\\{1,\\ldots,R\\}$.\n",
        "\n",
        "When affinely combined with a sample's group's features ($z_{r,i}$), the result is sample-specific noise on the $i$-th predicted linear response (which is otherwise $x_i^\\top\\omega$)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "__dP1MdYKda0"
      },
      "source": [
        "When we estimate $\\{\\Sigma_r:r\\in\\{1,\\ldots,R\\}\\}$ we're essentially estimating the amount of noise a random-effect group carries which would otherwise drown out the signal present in $x_i^\\top\\omega$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "0EZXZzlYSbM7"
      },
      "source": [
        "There are a variety of options for the $\\text{Distribution}$ and [inverse link function](https://en.wikipedia.org/wiki/Generalized_linear_model#Link_function), $g^{-1}$. Common choices are:\n",
        "- $Y_i\\sim\\text{Normal}(\\text{mean}=\\eta_i, \\text{scale}=\\sigma)$,\n",
        "- $Y_i\\sim\\text{Binomial}(\\text{mean}=n_i \\cdot \\text{sigmoid}(\\eta_i), \\text{total_count}=n_i)$, and, \n",
        "- $Y_i\\sim\\text{Poisson}(\\text{mean}=\\exp(\\eta_i))$.\n",
        "\n",
        "For more possibilities, see the [`tfp.glm`](https://github.com/tensorflow/probability/tree/master/tensorflow_probability/python/glm) module."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "XajrojApx5cR"
      },
      "source": [
        "## Variational Inference"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "fIQn1mlYAUzx"
      },
      "source": [
        "Unfortunately, finding the maximum likelihood estimates of the parameters $\\beta,\\{\\Sigma_r\\}_r^R$ entails a non-analytical integral. To circumvent this problem, we instead find the parameters which minimize an upper bound.  Writing $\\phi(x)=\\exp(-x^2/2)/\\sqrt{2\\pi}$ we find:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "9epWkJw0x8hw"
      },
      "source": [
        "$\\begin{align}\n",
        "-\\log \\overbrace{p(\\{y\\}_i^N|\\{x_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)}^{\\text{evidence}}\n",
        "\u0026 = -\\log \\int_{\\mathbb{R}^{\\sum_r |C_r|D_r}} \\overbrace{\\left(\\prod_i^N p(y_i | \\eta_i(u)) \\right)}^{\\text{likelihood}} \\overbrace{\\left(\\prod_r^R |\\Sigma_r^{-1/2}| \\prod_c^{|C_r|} \\phi(\\Sigma_r^{-1/2} u_{rc}) \\right)}^{\\text{prior}} \\, du\\\\\n",
        "\u0026 = -\\log \\int_{\\mathbb{R}^{\\sum_r |C_r|D_r}} \\frac{\n",
        "  q_\\lambda(u|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)\n",
        " }{\n",
        "  q_\\lambda(u|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)} \\left( \\prod_i^N p(y_i | \\eta_i(u)) \\right) \\left(\\prod_r^R |\\Sigma_r^{-1/2}| \\prod_c^{|C_r|} \\phi(\\Sigma_r^{-1/2} u_{rc}) \\right) \\, du\\\\\n",
        "\u0026 \\le \\text{E}_{q_\\lambda(U|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)} \\left[ -\\log\n",
        "\\frac{\n",
        "  \\left( \\prod_i^N p(y_i | \\eta_i(U)) \\right) \\left(\\prod_r^R |\\Sigma_r^{-1/2}| \\prod_c^{|C_r|} \\phi(\\Sigma_r^{-1/2} U_{rc}) \\right)\n",
        "  }{\n",
        "    q_\\lambda(U|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)\n",
        "  }  \\right]\\\\\n",
        "\u0026= \\text{KL}\\left[q_\\lambda(U|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R) \\Bigg| \\left( \\prod_i^N p(y_i | \\eta_i(U)) \\right) \\left(\\prod_r^R |\\Sigma_r^{-1/2}| \\prod_c^{|C_r|} \\phi(\\Sigma_r^{-1/2} U_{rc}) \\right) \\right]\n",
        "\\end{align}$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "ecNUsIBQN-zz"
      },
      "source": [
        "The inequality follows from [Jensen's Inequality](https://en.wikipedia.org/wiki/Jensen%27s_inequality)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "GCDXHiEx-dY5"
      },
      "source": [
        "So, instead of solving:\n",
        "\n",
        "$$\\begin{align}\n",
        "\\{\\beta^*, \\{\\Sigma_r^*\\}_r^R\\} = \\operatorname{\\arg\\min}_{\\beta,\\{\\Sigma_r\\}_r^R} \\left\\{\n",
        " -\\log  p(\\{y\\}_i^N|\\{x_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R)\n",
        "\\right\\}\n",
        "\\end{align}$$\n",
        "\n",
        "we solve:\n",
        "\n",
        "$$\\begin{align}\n",
        "\\{\\lambda^*, \\beta^*, \\{\\Sigma_r^*\\}_r^R\\} = \\operatorname{\\arg\\min}_{\\lambda,\\beta,\\{\\Sigma_r\\}_r^R} \\left\\{\n",
        "\\text{KL}\\left[q_\\lambda(U|\\{x_i,y_i,z_i\\}_i^N,\\beta,\\{\\Sigma_r\\}_r^R) \\Bigg| \\left( \\prod_i^N p(y_i | \\eta_i(U)) \\right) \\left(\\prod_r^R |\\Sigma_r^{-1/2}| \\prod_c^{|C_r|} \\phi(\\Sigma_r^{-1/2} U_{rc}) \\right) \\right]\n",
        "\\right\\}\n",
        "\\end{align}$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Nu8B7ylx3UdL"
      },
      "source": [
        "## Toy Problem"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "vDmAfghTJcLo"
      },
      "source": [
        "[Gelman et al.'s (2007) \"radon dataset\"](http://www.stat.columbia.edu/~gelman/arm/) is a dataset sometimes used to demonstrate approaches for regression. (E.g., this closely related [PyMC3 blog post](http://twiecki.github.io/blog/2014/03/17/bayesian-glms-3/).) The radon dataset contains indoor measurements of Radon taken throughout the United States. [Radon](https://en.wikipedia.org/wiki/Radon) is naturally ocurring radioactive gas which is [toxic](http://www.radon.com/radon_facts/) in high concentrations.\n",
        "\n",
        "For our demonstration, let's suppose we're interested in validating the hypothesis that Radon levels are higher in households containing a basement. We also suspect Radon concentration is related to soil-type, i.e., geography matters.\n",
        "\n",
        "To frame this as an ML problem, we'll try to predict log-radon levels based on a linear function of the floor on which the reading was taken.  We'll also use the county as a random-effect and in so doing account for variances due to geography. In other words, we'll use a [generalized linear mixed-effect model](https://en.wikipedia.org/wiki/Generalized_linear_mixed_model)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "_zr34b0IBqgY"
      },
      "outputs": [],
      "source": [
        "%matplotlib inline\n",
        "\n",
        "\n",
        "from pprint import pprint\n",
        "import collections\n",
        "import matplotlib.pyplot as plt; plt.style.use('ggplot')\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "import seaborn as sns; sns.set_context('notebook')\n",
        "import tensorflow.compat.v1 as tf\n",
        "import warnings"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "UzepxbtrpHpD"
      },
      "source": [
        "### Obtain Dataset:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "Z5aSvBj8v_vp"
      },
      "outputs": [],
      "source": [
        "from six.moves import urllib\n",
        "CACHE_DIR = os.path.join(os.sep, 'tmp', 'radon')\n",
        "\n",
        "def cache_or_download_file(cache_dir, url_base, filename):\n",
        "  \"\"\"Read a cached file or download it.\"\"\"\n",
        "  filepath = os.path.join(cache_dir, filename)\n",
        "  if tf.gfile.Exists(filepath):\n",
        "    return filepath\n",
        "  if not tf.gfile.Exists(cache_dir):\n",
        "    tf.gfile.MakeDirs(cache_dir)\n",
        "  url = os.path.join(url_base, filename)\n",
        "  print(\"Downloading {url} to {filepath}.\".format(url=url, filepath=filepath))\n",
        "  urllib.request.urlretrieve(url, filepath)\n",
        "  return filepath\n",
        "\n",
        "\n",
        "def download_radon_dataset(cache_dir=CACHE_DIR):\n",
        "  \"\"\"Download the radon dataset and read as Pandas dataframe.\"\"\"\n",
        "  url_base = 'http://www.stat.columbia.edu/~gelman/arm/examples/radon/'\n",
        "  # Alternative source:\n",
        "  # url_base = ('https://raw.githubusercontent.com/pymc-devs/uq_chapter/'\n",
        "  #             'master/reference/data/')\n",
        "  srrs2 = pd.read_csv(cache_or_download_file(cache_dir, url_base, 'srrs2.dat'))\n",
        "  srrs2.rename(columns=str.strip, inplace=True)\n",
        "  cty = pd.read_csv(cache_or_download_file(cache_dir, url_base, 'cty.dat'))\n",
        "  cty.rename(columns=str.strip, inplace=True)\n",
        "  return srrs2, cty\n",
        "\n",
        "\n",
        "def preprocess_radon_dataset(srrs2, cty, state='MN'):\n",
        "  \"\"\"Preprocess radon dataset as done in \"Bayesian Data Analysis\" book.\"\"\"\n",
        "  srrs2 = srrs2[srrs2.state==state].copy()\n",
        "  cty = cty[cty.st==state].copy()\n",
        "  \n",
        "  # We will now join datasets on Federal Information Processing Standards\n",
        "  # (FIPS) id, ie, codes that link geographic units, counties and county\n",
        "  # equivalents. http://jeffgill.org/Teaching/rpqm_9.pdf\n",
        "  srrs2['fips'] = 1000 * srrs2.stfips + srrs2.cntyfips\n",
        "  cty['fips'] = 1000 * cty.stfips + cty.ctfips\n",
        "\n",
        "  df = srrs2.merge(cty[['fips', 'Uppm']], on='fips')\n",
        "  df = df.drop_duplicates(subset='idnum')\n",
        "  df = df.rename(index=str, columns={'Uppm': 'uranium_ppm'})\n",
        "  \n",
        "  df['radon'] = df.activity.apply(lambda x: x if x \u003e 0. else 0.1)\n",
        "  \n",
        "  # Remap categories to start from 0 and end at max(category).\n",
        "  county_name = sorted(df.county.unique())\n",
        "  df['county'] = df.county.astype(\n",
        "      pd.api.types.CategoricalDtype(categories=county_name)).cat.codes\n",
        "  county_name = map(str.strip, county_name)\n",
        "  \n",
        "  df['log_radon'] = df['radon'].apply(np.log)\n",
        "  df['log_uranium_ppm'] = df['uranium_ppm'].apply(np.log) \n",
        "  df = df[['log_radon', 'floor', 'county', 'log_uranium_ppm']]\n",
        " \n",
        "  return df, county_name"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "DLn6q9fSNizw"
      },
      "outputs": [],
      "source": [
        "df, counties = preprocess_radon_dataset(*download_radon_dataset())"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 204
        },
        "colab_type": "code",
        "id": "5pXUQLVxi8E0",
        "outputId": "0cd5c907-23f6-4735-ec4b-7fdc5a05079f"
      },
      "outputs": [
        {
          "data": {
            "text/html": [
              "\u003cdiv style=\"max-width:1500px;overflow:auto;\"\u003e\n",
              "\u003cstyle scoped\u003e\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "\u003c/style\u003e\n",
              "\u003ctable border=\"1\" class=\"dataframe\"\u003e\n",
              "  \u003cthead\u003e\n",
              "    \u003ctr style=\"text-align: right;\"\u003e\n",
              "      \u003cth\u003e\u003c/th\u003e\n",
              "      \u003cth\u003elog_radon\u003c/th\u003e\n",
              "      \u003cth\u003efloor\u003c/th\u003e\n",
              "      \u003cth\u003ecounty\u003c/th\u003e\n",
              "      \u003cth\u003elog_uranium_ppm\u003c/th\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/thead\u003e\n",
              "  \u003ctbody\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e0\u003c/th\u003e\n",
              "      \u003ctd\u003e0.788457\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.689048\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e1\u003c/th\u003e\n",
              "      \u003ctd\u003e0.788457\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.689048\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e2\u003c/th\u003e\n",
              "      \u003ctd\u003e1.064711\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.689048\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e3\u003c/th\u003e\n",
              "      \u003ctd\u003e0.000000\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.689048\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e4\u003c/th\u003e\n",
              "      \u003ctd\u003e1.131402\u003c/td\u003e\n",
              "      \u003ctd\u003e0\u003c/td\u003e\n",
              "      \u003ctd\u003e1\u003c/td\u003e\n",
              "      \u003ctd\u003e-0.847313\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/tbody\u003e\n",
              "\u003c/table\u003e\n",
              "\u003c/div\u003e"
            ],
            "text/plain": [
              "   log_radon  floor  county  log_uranium_ppm\n",
              "0   0.788457      1       0        -0.689048\n",
              "1   0.788457      0       0        -0.689048\n",
              "2   1.064711      0       0        -0.689048\n",
              "3   0.000000      0       0        -0.689048\n",
              "4   1.131402      0       1        -0.847313"
            ]
          },
          "execution_count": 0,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "_OxaVNnjYZyL"
      },
      "source": [
        "### Specializing the GLMM Family"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "niha5M54Yjf-"
      },
      "source": [
        "In this section, we specialize the GLMM family to the task of predicting radon levels. To do this, we first consider the fixed-effect special case of a GLMM.\n",
        "\n",
        "Using R notation, we might consider the following GLM:\n",
        "\n",
        "    log(radon) ~ 1 + floor\n",
        "\n",
        "This model posits that the `radon` response is governed by the floor of a building (e.g., \"ground floor\" of a \"two story\" home).  More concretely it states that the `log(radon)` reading is explainable (in expectation) by the formula `offset + weight_floor[floor]`, i.e., there's a weight learned for every floor and a universal `intercept` term. In R's \"tilde notation\", the `1` indicates there's a weight associated with the \"null feature\", i.e., a weight associated with every sample.\n",
        "\n",
        "Given our data, seems like it might be a good start. I.e.,"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 578
        },
        "colab_type": "code",
        "id": "YwzykNvJgfJo",
        "outputId": "c1f37499-7763-4597-f2d9-91c45627a15a"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "\u003cmatplotlib.text.Text at 0x7f9aebf26410\u003e"
            ]
          },
          "execution_count": 0,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae9c03790\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae9c03510\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "df['log_radon'].plot(kind='density');\n",
        "plt.xlabel('log(radon)')\n",
        "plt.figure()\n",
        "df['floor'].value_counts().plot(kind='bar')\n",
        "plt.xlabel('Floor')\n",
        "plt.ylabel('Count')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "8MqU1SefgRy5"
      },
      "source": [
        "Although this seems like a good start, including something about geography is probably even better. I.e.,\n",
        "\n",
        "    radon ~ 1 + floor + county\n",
        "\n",
        "This model posits that the `radon` response is goverened by `offset + weight_floor[floor] + weight_county[county]`, i.e., the same as before except with a county-specific weight."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "rcddRr2Ug1cH"
      },
      "source": [
        "In the absence of a training set, `radon ~ 1 + floor + county` feels right.  However, if we studied the training data, we'd discover that there's there's a large number of counties with a very small number of measurements. I.e.,"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 350
        },
        "colab_type": "code",
        "id": "15f4k6gQg40_",
        "outputId": "4d5726ac-9e74-4fa5-a77e-d725e1a4470d"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nxmrSpEnq06ePkpKSIl01AAAAAAAAY3U90rOhvc+zIY3abcg8ka7A+fbu3auEhARddNFFatKkiQYN\nGqStW7cNRML8AAAgAElEQVRGuloAAAAAAACApHOjCsv/V/aI8fmPLFdXtny56so6iVlevRsZmJOT\no/j4eP/PcXFx2rt3bwRrBAAAAAAAAJxjOrlPWdnafuw72CPfVal3ycCq1CTD6bkoQaUBlgfT/sJm\nNVpeXnTLqgedBlpeJiYmpkbLyyttFl+j5WVaRrWt0XL/50ZFGa2TzPdJoHKhlDXdn6b7UjLfn6b7\nUqr9/Wm6L8vWmZQ13ZfVrZPc0Tal2t+fDaltVrdOckfblGp/fzaktlndOskdbdNJWdombVOibdI2\nz6nttlndOskdbVOq+3uU+tQ2q1snuaNtSnV/j1Kf2mZ166SG1TYbMsuuZ29C3L17t1auXKnJkydL\nktLS0iSJSUQAAAAAAAAAh+rdOwO7dOmirKwsHT9+XCUlJXr//feVnJwc6WoBAAAAAAAADV69Gxko\nSTt37tTSpUtl27auv/56RgUCAAAAAAAAtaBeJgMBAAAAAAAA1L5695gwAAAAAAAAgPAgGQgAAAAA\nAAC4BMlAAAAAAAAAwCVIBgIAAAAAAAAu0STSFQAANyspKdH777+v2NhYde/eXRs3btS//vUvJSUl\n6YYbblCTJpymUT/t3btXktSlSxcdOnRIO3fuVGJionr16hXhmgGoDc8//7weeeSRsMY4fPiwtm7d\nqpycHFmWpdjYWCUnJ6tDhw5hjQsAgNsxmzAajJMnT6p169Zh+/w9e/YoKSlJLVq0UHFxsdLS0rR/\n/3516NBBt9xyi1q0aBG22GVOnTqlCy+8MOxxUH88++yz8vl8KioqUnR0tAoLC9WvXz9lZGTItu2w\n34ghdOE+B9WmcJ9LVq5cqZ07d8rn86l79+7as2ePunXrpoyMDPXo0UO33HJLndS1Pp8zs7KytGXL\nFmVnZ8vr9ap9+/a69tpr6+RaAvdas2aN+vbtqzZt2tSo3MyZMyv8bNu2Pv30U33rW9+SJE2cOLHW\n6lgmLS1N77//vgYNGqS4uDhJUk5Ojn9ZSkpKrccEqvL5559r7969uvjii9WjR49IVwdfq4t+1+HD\nh5WTk6PLL79czZs39y/fuXOnrrnmmrDGjqSG1KdF+DSaISeFhYV6/fXXtXnzZmVnZ6tJkyZq3769\nvvOd72jIkCFBy5Zv7AUFBXrppZe0b98+XXzxxbrvvvsUExNTB9/gG+np6Ro6dGiV60y/Z0FBgVav\nXq2tW7cqLy9PktS6dWslJycrJSVF0dHRtV42NzdXK1eulGVZ+uEPf6i///3v2rx5s5KSkvTjH/9Y\nsbGxAWPm5+dX+Nm2bT311FP+zmrLli2rLOdkXy5cuFCzZs2SJC1dulRRUVFKSUlRRkaGFixYoCee\neCJgWRMrVqzQiBEj1KpVK+3bt09z5syRZVny+Xx65JFHdNVVV9Xo88aNG6d58+YF/Z2jR4/qtdde\nU1xcnFJSUrRs2TJ/EnTUqFFq27ZtwLJFRUVau3atLMvSjTfeqA8++MC/P2+77bYKF9DySktLtW7d\nOmVnZ+uaa65R165d/etee+013XrrrTX6nqFwcj5wctwG8vTTT+upp56qct2XX36p2bNny+fz6YEH\nHtCiRYvk8Xj07W9/W7/4xS+Cfq5p25w9e7b69u2rvn37BtxvgZhuHyfHwdq1azVw4EC1atVKWVlZ\nWrhwoQ4ePKjExEQ98MAD6tixY5XlfD6f3n33XW3ZskUnTpyoMOrk+uuvDzrq0vQcNHHiRPXt21eD\nBg1S+/btA37++Uzbl1S755JQziOStGnTJs2aNUtnz57V2LFjtXDhQrVo0UIjR47UU089FTAZ6KSu\ntX3OdCpYu16zZo0++ugjXXXVVdq3b586deqk7OxsTZ48WWPGjFG3bt2qLGd6/Ejm53fTdnLw4EFd\ncsklks6NcH799df9N9O33nqroqKialT/MsG2qxNOtm1VnCaiFy1apJ/97GeO63G+V155Ra+//rra\ntWunQYMGacCAAWrVqlW15XJycpSUlKRhw4bJsizZtq39+/drxIgRRvUI5UYzPT1dv//97ysdY8OH\nD9eECROCJgNNryn79u3T8uXLFRsbq7vuuksLFy7U3r17lZiYqLFjx+rSSy8NGNP0+mca08kxa9o/\ncNKPNv2epaWlWr9+vTZv3qycnBx5PB4lJCToO9/5TsBzZRnT/sykSZM0ffp0SdI777yjt956S337\n9tWrr76qAwcOBDz2nPQrTBUUFCgtLU3Z2dnq2bOnrr32Wv+6JUuWaMyYMQHLmu5PJ30S0+PAtN9V\n9t1MttGaNWv01ltvKSkpSS+88IJGjx6tPn36SJL+53/+xzgZGOw65mR/mjLdtk7up0y/p2mfX6rd\nfkko/WEn565gTPsHJuUaTTLw2WefVd++fTV58mR9+OGHKiws1KBBg/Taa68pMzNTd911V8Cy5Rv7\nn/70J8XGxmrixInavHmzFi9erCeffLLKck46FMH89a9/DZgMNP2ec+bMUbdu3TRt2jT/iT83N1fr\n16/XM888oylTpgSsj2nZ+fPnq1evXioqKlJqaqquvfZaTZo0SVu3btWLL74YcLtK0v3331/pr9o5\nOTmaOHGiLMvS888/X2U5030pnTsxer1eSdL+/fv9J8iuXbsGTcqYdg63b9+uu+++W5K0fPlyPfbY\nY+rSpYsyMzP17LPPasaMGQFj3nvvvbIsy19v6dyFu2z5Sy+9VGW5BQsWaNCgQSooKNDkyZM1ZMgQ\n3Xbbbfr444+1cOFCTZ06NWDM+fPnq02bNiouLtaMGTOUlJSkESNG6KOPPtKLL76oRx99tMpyixcv\nVlFRkbp06aKlS5fqqquu0n333SdJ2rJlS9AkkGlH2Mn5wPS43b9/f8DP/OKLLwKus21bJSUlKiws\nVFFRkQoKCtSyZUudPXtWPp8v6Pc0bZt79uyRZVlaunSprr76al177bXq1atXSJ1Y0+3j5Dh4++23\ndeONN0o6l6j/z//8T/Xt21effvqpXnzxRf3Xf/1XleWee+45RUdH6/bbb1d8fLwkKTs7Wxs2bNBz\nzz2n8ePHB4xpeg7Kz8/X6dOnlZqaqpiYGA0aNEgDBw70j3oJxLR9SebnEtPziCR5vV55PB5FRUWp\nXbt2/tFuzZo1839mbdbVSVknHW/Tdr1u3TrNmjVLHo9Hw4cP1/Tp0zVt2jR95zvf0e9+9zv97ne/\nq7Kc6fEjmZ/fTdvJggUL/NfJl19+WadOndKIESO0ZcsWvfjii0FHNZtuV8k8yeFk25omos+/AStj\n27Z27NhRbdxAgt1otmvXTjNmzFBGRoY++OAD/fWvf1Xnzp01aNAg9evXTxdccEGV5aZPn641a9Zo\n1apVuueee9SpUyc1a9YspCS76Y2mZVk6ceKELrroogrLy5IswZheU5YsWaI77rhDp0+f1pQpU3Tf\nffdpypQpysjI0JIlS/Tf//3fAWOaXv9MYzo5Zk37B0760abf84UXXlCbNm30gx/8QJs2bdIFF1yg\nK6+8UqtWrdKXX36p73//+wFjmvZnyvev1q1bpylTpqhVq1YaMWKEJk+eHDAZ6KRfYZpYWbBggRIS\nEtSvXz+lp6dr06ZNGjdunJo2bao9e/YE/Z6m+9NJn8T0ODDtdznZRuvWrdPMmTPVvHlzHTt2TM88\n84yOHz+um266SdU9PGl6HXOyP02Tu6bb1sn9lOn3NO3zl8U06ZeY9oednLtM+we13a9oNMnA48eP\n+0+kw4cP16RJk3TbbbfpoYce0oQJE4IerOXt27fPPzps+PDh2rBhQ8DfddKhCDTKzLZtnTx5MmA5\n0+957NgxTZ48ucKymJgYpaSkKD09PWA8J2VPnjzpbwRvvfWW/8L6/e9/X++++27QmHfffbcyMjJ0\nzz33+P8C8PDDD2v+/PlBy5VXk30pSRdffLF/VOYll1yiffv26bLLLlNmZmbQToVp59Dn88nn88nr\n9aq4uFhdunSRJCUmJurs2bNB6zpkyBAVFBRo1KhR/hN/KNvnzJkz+u53vyvp3D4p+4v/9ddfr7Vr\n1wYte+TIEU2YMEG2bWvs2LGaMmWKLMvSlVdeGTRZunfvXs2ePVuSdOONN2rJkiWaPXu2xo0bV+2F\n1rQj7OR8YHrcTpo0KeBN0+nTpwOWGzp0qB577DGVlpbqzjvv1DPPPKO2bdtqz549GjhwYNDvado2\nW7durccff1xnzpzR1q1btW7dOi1atEi9e/fWoEGDgj4iY7p9nBwH5TvteXl56tu3rySpW7duOnPm\nTMByBw4cqPRXvfj4eF1xxRUaN25c0Jim56CWLVvq3nvv1b333qtdu3bp/fff18SJE9WhQwcNGjRI\nN9xwQ5XlTNuXZH4uMT2PSFKTJk1UVFSkqKioCkm4goICeTyB5yZzct4zLeuk423arsvq6/F4dPbs\nWf9x2qZNm6BJftPjRzI/v5u2k/LtNiMjQ9OnT1eTJk1COmadbFfTJIeTbWuaiL7//vt10UUXVdhW\nZaPugvX1JPMbTcuy5PF41KNHD/Xo0UMlJSXauXOnNm7cqD//+c/6wx/+UGW5ssT1gAED9NJLL6l1\n69bV/kGqjOmN5ujRo/Wb3/xGCQkJ/sTKV199paysLN1///1BY5peU3w+n3r27CnpXJK3f//+kqSr\nr75af/7zn4PGNL3+mcZ0csw66feXqWk/2vR77t+/Xw899JCkc3+Anzx5sn74wx/qyiuv1JNPPhn0\nhtq0P2PbtvLz82Xbtmzb9o+ebd68uX9gQFWc9CtMEytHjx713zf27dtXq1at0m9+85ugidmq1GR/\nOu2TmBwHTu79TLdRaWmpf5Rj27ZtNW3aNP3+97/X8ePHq+2bml7HnOxP0+Su6bZ1cj9l+j1N+/yS\neb/EtD/s5Nxl2j9w0q+oSqNJBkZFRenzzz9X165dtW3bNv9fIT0eT7WN+eTJk3rzzTdl27bOnDkj\n27YrZYer4rRDMXny5Ep/wbZtO+goPdPvedFFF+n111/X4MGDK3Weq3uvjGnZ8vUZPHhwwHVVGTly\npAYNGqSXXnpJ8fHxuuOOO6r9K7Fkvi8l6YEHHtDSpUu1atUqXXjhhfrVr36l+Ph4xcfHBx1ya9o5\n/N73vqfp06crJSVFPXr00LJly9S3b1998skn6tSpU9C6/uQnP9H+/fs1b9489enTRzfeeGNI28ey\nLGVmZqqgoEDFxcX+hGdWVpZKS0urLV/2GT179vTHsywraOySkhL/v71er372s59p5cqV+s1vfqPC\nwsKgsUw7wk7OB6bHbYcOHTR27FglJCRUWvfggw8GLDd8+HB/0i8uLk6DBw9WRkaGbrjhBn+yIxDT\ntlm2vy644AJdd911uu6665Sfn68PPvhAaWlpQZOBwbZPsGPIyXHQv39/zZ8/X7fddpv69Omj//3f\n//W/VzHY92zZsqU+/PBD9evXz5+gKi0t1aZNm4K+GkEyPweV3z5XXnmlrrzySv3kJz/Rxx9/rA8+\n+CDozZtU8/YlmZ9LTM8jkpSamqqmTZtKUoXkX0lJiR5++OFar6uTsk463qbtetiwYZo0aZIuv/xy\n7dq1SzfffLOkcx3bYI86lVfT48f0/G7aTgoKCrRlyxaVlpaqpKTE/0ezUI5Z0+0qmSc5nLRN00R0\nu3bt9Otf/7rK81R139P0RvP861STJk2UnJys5ORkFRcXB40pnUtsTJgwQdu3bw84ivB8pjea11xz\njebNm6e9e/cqJydH0rnrYJcuXYL+UUEyv6Y0bdpU//znP1VQUCDLsrRlyxb17dtXn332WbUxTfsH\nTmKWqekxa9o/cNKPNv2eXq9XWVlZat++vfbv3+8/l5RdY4Ix7c8UFBTol7/8pf/75ebmKiYmRoWF\nhUG/p5N+hWlipaSkRKWlpf54t9xyi+Li4jR16tRq+09O9qdk1icxPQ5M+12S+TaKiYnRF1984e9D\nNG/eXL/85S+1cOFCffnll0Fjml7HnOzP8mqS3DXdtk7up0y/p2mfXzrXrjdv3ux/6irUfolpf9jJ\nucu0f+CkX1GVRpMM/OlPf6oXXnhBR44c0cUXX+zfGHl5efre974XtOywYcP8mebBgwfr1KlTatWq\nlXJzc4PeYDi5uPfq1UuFhYVVfn6wRzLKvmdmZqY6duwY8vd87LHHlJaWpmnTpvmzxjExMerdu3fQ\nIe1OyiYnJ6uwsFDNmzfXnXfe6V+elZVV5YnzfGUd0m3btum3v/2tioqKqi1jui8lqUWLFnr44Yd1\n5swZHT16VKWlpYqLi6v2nZGmyZHvf//76tixo95++20dOXJEPp9PR44cUZ8+fUJ6+X7nzp01ZcoU\nrV27VtOmTat2VI0kjRo1SjNnzpTH49EvfvELrV69Wl9++aUKCgo0duzYoGUvu+wy//4s+yuIdG5/\nBnt3SOfOnSu9hPf2229XXFyclixZUm2dy9SkIzxmzBgtWrTI6HxgetzefvvtAS+MP/7xj4PGLD/S\nMTo62v+HheqYts2q9lfLli313e9+1z+yKJBg2ycxMTFgOSfHwY9+9COtX79e8+bN09GjR3X27Fm9\n88476tOnj37+858HLDdu3DitWLFCS5YsUcuWLWXbtgoKCtStWzc99thjQWNKZuegqraBx+PRNddc\nE/TdM6btSzp3Lrn44ov1f//3fzU+l5icR6TAHZ1WrVoFfT+Zk/OeaVknHW/Tdn3TTTfp6quv1uHD\nhzV8+HAlJSVJOrd9UlNTA5ar6hwTyvEjBT+/B/uDVlk7+cMf/uC/mT19+nS17eTKK6/Utm3bJEmX\nX365/2Y6Nze32nfpOTlfmiY5TNumZJ6Ivummm5Sfn19lvUaOHBk0pumNZrB91qxZs6Axy+vVq1fI\nM4M7uYn3eDy64oorQq5XGdNryk9/+lOtWLFClmVp8uTJevvtt7VgwQLFxcVV+64l0/5BVTEXLlyo\n2NjYoH0vJ+cD0/6Bk3606fe85557lJqaqmbNmqmkpMR/DOfl5al3795BY5r2ZwIlqi3LCjqCyPR8\nKZknVnr37q1PPvlE3bt39y8bMmSIYmJi9Mc//jFoTNP96aRP4qSNmfS7JPNt9Mgjj1QaCer1evXI\nI49U+8db0+uYk/3pJLlrsm2d3E+Zfs8f/ehHSk9Pr3GfXzqXQ/noo48k1bxfYtIfLjt3NW3aVD6f\nzz86OJRzl2n/wEm/oiqNZjbh8jPBFhUV6fXXX6/RTLAmMwl98cUX/pPdfffdp7ffflsbNmzwn+z+\n4z/+o1a/o2Q+S9z52yctLU0HDhwIafuYxjxfTWfqKr9PPB6PsrKy1LFjx6D7xMn3NPXKK6/o5ptv\nrnRxzMrK0ooVK/T444+Hva4nTpzQ448/Xu1FpCozZszQk08+WW0C++zZs/rggw8UGxur7t27a+PG\njfrXv/6lpKQk3XDDDQEfpTYtJ0lz584NKWlTlUOHDiknJ0dXXHFFjWYHM51VurbaSU0dPnxY2dnZ\nNf6e53v++edDnrm4tmZeq0nMvXv3SpK6dOmif//739q5c6eSkpJCvlk9deqUbNvWsmXLqu1MVGXX\nrl367LPP1KVLl6Dnr/OPn9WrVxu367LtU76zVxUnx1757bpr1y59+umn6ty5c8jb1URtHT+7du3S\n3r171bFjx6D7ZPny5erevXuFDmlZvD/+8Y969tln66S+oXISr+z9WWXtZMeOHerQoUO1+7OsXLt2\n7XT48GHt3r07pHLnC7VNO2kn+fn5SktL07Zt2yolOVJSUgKOvHR6jv70008rJKLbtGmjPn36aOjQ\noUEfKyzfxg4dOqSdO3cqMTGx2m27adMmdezYscokZtkfn+ujbdu2afXq1Tp27JhefPHFsMYy2bZO\njoPaus6Heu46n5MZb0ON6eQ7OmnXu3fvlsfjqXE7kczbmImSkhJt3LhRcXFxuvTSS7Vjxw7/+bK6\nPu3BgwcrDVxJTExUXl6eNm7cqJtuuimkOjg5DmpSNtB2LT9SMJBDhw7pxIkTNbqOnX/sFRcX++/9\nqlObfS9ToW5bJ21s5cqVFX7+3ve+50/uLl++POD19/x7zpUrV+rAgQO69NJLa7R9nNzLlz8OduzY\n4X+6MhTPPfdc0PdUlle+HxTq+aCkpETvv/++/171vffe01//+leNGDFCw4YNC9qubdv2J9mlmt3b\nnC+Usk7uq6vSaJKBEyZM0KxZs+T1erVo0SJFRUWpf//+ysjI0MGDB4POBPv3v/9da9euVVJSkg4e\nPFhhJqGJEyf6X0RZE8FmBHbivvvuU/PmzdWuXTtde+216t+/f0izxDnZPqYxA83U9fHHH/s77YGU\nn92pJvvEyfcMh2DHgZO6VvX9P/nkE33rW9+SdG4b1WY56dy7Tnw+n4qKihQdHa3CwkL/sG1JAR8N\nNC1XnWDbds2aNXr77beVmJhY4zZtul/Kt5OazODohGk7OX+5bdv69NNPQzoOTM+XTmKuXLlSO3fu\nlM/nU/fu3bV3715dddVVysjIUI8ePQKOCnNyvJ9//nr77bfVp0+fas9fpsePk+1jeo423a5OmB6z\nUsV9sm7dOr311lsh7ZNgqrtWO6mvCSf9EdP9GYn2Fa5rdbD9Ga5zdLCY52/bPXv2qFu3bo7bWLj6\nmLWl/E18uOpqum2dHAemZU2vJ0760abnSyfbx7RdO7kWhauNBVLWpy0uLvYnVvr27auMjAzZtm2c\nBAjWTmrzOFi7dm1IZZ1sV9M+eCSOPSdM90skrkWm28f0+JFq735BCr1vYXouOf9eNdR27aSupv3+\nYPfVJuegRvOYsOlMsNK5Bmw6k1AgwWYEduL8WeJeeeWVkGaJc7J9TGOaztRV9vsm+8TJ9wyHYMeB\nk7rm5OQoKSlJw4YN8780dN++ff4XxgeSnZ2tDh061LicJH355ZeaPXu2fD6fHnjgAS1atEgej0ff\n/va3g9bXtFx1gm3bdevWacaMGUZt2nS/mM7g6IRpO6nqONi/f39Ix4Hp+dJJzE2bNmnWrFk6e/as\nxo4dq4ULF6pFixYaOXKknnrqqYAXd9N2IlU+f/3qV78K6fxlevw42T6m52jT7eqEk5n7yu+Td955\nJ+R9Ekx112on9TXhpD9iuj9Nyzm5noTrWh1sf4brHB0sZrjaWLj6mLWlWbNm/tE84aqr6bZ1chyY\nljW9njjpR5ueL51sH9N27aSd1PV1LBJ92to8DkIt62S7mvbBI3HsOWG6XyJxLTLdPqbHT9nvm/Rn\nnPTdTY9b03btpB9k2u+v7XNQo0kGms4EK5nPJGQ6I7ATprPEOdk+pjFNZ+qSzPeJk+9pyvQ4cFLX\n6dOna82aNVq1apXuuecederUSc2aNQv6vknp3CPBJuXKvk9JSYkKCwtVVFSkgoICtWzZUmfPng06\n46BpOcl82zqZHcx0v5i2EydMv6eT4yASMb1erzwej6KiotSuXTv/4wzNmjUL+qiKaTuRzM9fpseP\nk+1jeuyZblcnnLRN033i5FrtpL4mnMQz3Z+m5Zwcs06uf6b708k52jSmkzYWiT6mqUjU1XTbOjkO\n6ro/7KQfbVrWyfYxbddO2kldX8ci0aeNxHHgZLuaXscicew5EYk2Vtf3nJG4l3fSdzc9bk3btZN+\nkGlZJ+egqjSaZKDpTLCS+UxCpjMCO2E6S5yT7WMa03SmLsl8nzj5nqZMjwMndfV4PBo+fLgGDBig\nl156Sa1btw7pBGBaTpKGDh2qxx57TKWlpbrzzjv1zDPPqG3bttqzZ49/NtzaLCeZb1sns4OZ7hfT\nduKE6fd0chxEImaTJk1UVFSkqKgozZgxw7+8oKAg6LsuncQ0PX+ZHj9O6mp67JluVyectE3TfeLk\nWu2kviacxDPdn5FoX06uf6b708k52jSmkzYWiT6mqUjU1XTbOjkO6ro/7KQfbVrWyfYxbddO2kld\nX8ci0aeNxHHgZLuaXscicew5EYk2Vtf3nJG4l4/E/YJpu3ZSV9OyTs5BVbIbmYKCAvvAgQP2vn37\n7BMnToRU5quvvgr4u7t27QpYbsGCBQHXz507N6TYNXX48GFH5U22j9OY5yssLLSPHj0a9HdM90kZ\nk+9pyulxUBt1/eijj+wVK1aEvVx2dradnZ1t27Zt5+fn2x9++KG9Z8+esJUz3bZOjx/brvl+qe12\nEora+J62XbPjIBIxi4uLq1x+8uRJ++DBg2GJGUgo5y/bdt6ua1JX02OvtrZrTdTW8VNedfvEyTk6\nHPUNVzzT/RnJ9mXSTkz3p5NztGlMJ9s2En1MU5Goq+m2dXIcRKI/XJvlQilbG9+xpu3aSTuJxHWs\nrvu0gYTzOHCyXU2vY5E49sIhnG2sPtxz2nbd3MuXqav7BdN2bVpXJ2Vro65lGs0EIgAAAAAAAACC\nC89zQAAAAAAAAADqHZKBAAAAAAAAgEuQDAQAAAAAAABcotHMJgwAAOBWPp9Pr776qj744AM1adJE\ntm2rZ8+euvvuu8Myq+b69evVtWtXtW/fvsZlMzMz9fLLL+vgwYOKiopS8+bNlZKSouTk5Bp9zg9/\n+EP96U9/UlRUVI3rAAAA4GYkAwEAABq4+fPnq6SkRL/73e8UFRWl0tJSpaen6+zZs2FJlm3YsEGt\nWrWqcTIwNzdX06ZN07333qsnnnjCv+zjjz+u9ToCAACgaiQDAQAAGrCsrCxt27ZNL7zwgj/x5/F4\nNGzYMElSaWmpli9frn/+85+yLEs9evTQqFGjZFmWUlNTNWLECPXq1UuSKvycmpqqyy67TLt379aJ\nEyc0YMAA3XXXXVq/fr327dunpUuX6pVXXtGoUaO0bNkyPfzww+rcubP0/+3dT0hUWwDH8a8OE2oG\nU4s0kkwh24gpBBGIXGJMWkRtgjZtXRSzKchcJUFGRBG0c1ZhglC0qAxBpWbRIlq0KBeh4SCWGkER\ndLFSb6t33xve9OfR473nm+9ndTnnnnPPucsf5w9w7949Xr9+TXd3d8FYR0dHaW5upr29PS5LpVJ0\ndAJvPnUAAAOiSURBVHTEc8lms3z48IFEIsHRo0dpbW0F4PHjxwwPD1NdXU1bW1tBv9PT0wwNDbG0\ntATAkSNH4jlJkiSpkGGgJEnSGjYzM8OWLVuoqqoqWj8+Ps7s7CyXLl0iiiL6+/sZHx+ns7Pzh32/\nffuWc+fOEYYhmUyGffv2EQQBuVyuIEQ8cOAAo6OjHD9+HICxsTFOnTpVdKy7du365veuXbtGZ2cn\nQRAwNzfH2bNnuXr1KlEUMTAwwPnz56mtreXOnTtxmzAMyWaz9Pb2kkqleP/+Pb29vVy+fPmb/0SS\nJKmUGQZKkiStYVEUfbf+2bNnBEEQnx0YBAFPnjz5qTBw7969AFRVVVFXV8fi4mLRrcEdHR3cunWL\njx8/MjU1RSqVYtu2bX9pHktLS+TzeYIgAKCuro6GhgampqZYXV2lsbEx/nY6nWZoaAiAFy9e8ObN\nGy5cuBD/i/LychYWFuKVipIkSfqdYaAkSdIa1tjYyPz8PGEYFl0J972wsLy8vKD+8+fPBfXJZLLg\n3ZWVlaL9rFu3jvb2dh48eMDk5CRdXV1F32toaGB6erpoXbFx/rHse8/19fX09fUV7VeSJEmF/v7r\n5SRJkvSPqa2tZffu3QwMDMRn5q2urnL//n0+ffpES0sLuVyOlZUVlpeXyeVytLS0AFBTU8PLly8B\nmJubI5/P/9Q3KysrCcOwoGz//v2MjIwwMzPDnj17irbr6uri+fPnPHr0KC579+4dExMTVFZWsn37\ndh4+fAjAq1evmJ2dZceOHTQ1NZHP51lYWABgYmIibr9z507m5+eZnJyMy36bkyRJkv7MlYGSJElr\n3IkTJ7h58yY9PT0kk0miKKKtrY1kMkk6nWZxcZHTp09TVlZGa2trfLnI4cOHuXLlCk+fPqW+vv6n\nt9Wm02kGBwe5e/cux44do7m5mc2bN7N161aamppIJBJF223cuJG+vj5u3LjB8PAwFRUVVFRUcOjQ\nIQAymQzZbJaRkRESiQSZTIYNGzYA0N3dzcWLF6muro63LwOsX7+enp4eBgcHuX79Ol++fKGmpoYz\nZ878yi+VJEn63yqLfnTQjCRJkvQDYRhy8uRJ+vv72bRp0789HEmSJH2DKwMlSZL0S8bGxrh9+zYH\nDx40CJQkSfqPc2WgJEmSJEmSVCK8QESSJEmSJEkqEYaBkiRJkiRJUokwDJQkSZIkSZJKhGGgJEmS\nJEmSVCIMAyVJkiRJkqQSYRgoSZIkSZIklYivrxFoDYT2EA8AAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9aeb591490\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "fig, ax = plt.subplots(figsize=(22, 5));\n",
        "county_freq = df['county'].value_counts()\n",
        "county_freq.plot(kind='bar');\n",
        "plt.xlabel('County Code');\n",
        "plt.ylabel('Count');"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "VxtwlODcdJZe"
      },
      "source": [
        "This is worrisome.  If we attempted to fit this model, the `weight_county` vector would likely end up memorizing the results for counties which had only a few training samples. Not good.\n",
        "\n",
        "GLMM's offer a happy middle to the above two GLMs.  I.e., we might consider fitting,\n",
        "\n",
        "    radon ~ 1 + floor + (1 | county)\n",
        "\n",
        "This model is exactly the same as the first, except we've introduced the random-effect, `(1 | county)`.  Adding this random effect has the effect of allowing per-county random fluctuations in radon  In words, `(1 | county)` means that across samples and within a county, the random fluctuation in observed radon will be the same draw from a random Normal . Furthermore, since the covariance is shared among a group (i.e., a \"random effect\"), the counties with more observations provide a hint at the variance of counties with few observations (since the variance is estimated from the whole group)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "QjvAR2-ZYgxP"
      },
      "source": [
        "## Experiment"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "bioH0_7ZfC4Z"
      },
      "source": [
        "We'll now try to fit the `radon ~ 1 + floor + (1 | county)` GLMM using variational inference in TensorFlow. Our only remaining trick is to use stochastic gradient descent. (For brevity, we omit additional details.)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "17Lf6EEfGMSJ"
      },
      "source": [
        "### Imports"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "YKuwO2YmH9gG"
      },
      "outputs": [],
      "source": [
        "import tensorflow_probability as tfp\n",
        "\n",
        "tfd = tfp.distributions\n",
        "tfb = tfp.bijectors"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "J1qaYmpKYdX_"
      },
      "source": [
        "The following code allows `Session` customization.  Feel free to play with the `session_options` arguments and see how computational performance changes."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "hX3rIfVZCAIk"
      },
      "outputs": [],
      "source": [
        "def session_options(enable_gpu_ram_resizing=True,\n",
        "                    enable_xla=False):\n",
        "  \"\"\"Convenience function which sets common `tf.Session` options.\"\"\"\n",
        "  config = tf.ConfigProto()\n",
        "  config.log_device_placement = True\n",
        "  if enable_gpu_ram_resizing:\n",
        "    # `allow_growth=True` makes it possible to connect multiple colabs to your\n",
        "    # GPU. Otherwise the colab malloc's all GPU ram.\n",
        "    config.gpu_options.allow_growth = True\n",
        "  if enable_xla:\n",
        "    # Enable on XLA. https://www.tensorflow.org/performance/xla/.\n",
        "    config.graph_options.optimizer_options.global_jit_level = (\n",
        "        tf.OptimizerOptions.ON_1)\n",
        "  return config\n",
        "\n",
        "def reset_sess(config=None):\n",
        "  \"\"\"Convenience function to create the TF graph and session, or reset them.\"\"\"\n",
        "  if config is None:\n",
        "    config = session_options()\n",
        "  tf.reset_default_graph()\n",
        "  global sess\n",
        "  try:\n",
        "    sess.close()\n",
        "  except:\n",
        "    pass\n",
        "  sess = tf.InteractiveSession(config=config)\n",
        "\n",
        "reset_sess()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "VkJaseCAGes0"
      },
      "source": [
        "### Setup"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "1dwMTHinKHe5"
      },
      "source": [
        "For transparency, we'll record all knob settings here."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "QFy2NhmkBfGL"
      },
      "outputs": [],
      "source": [
        "hparams = tf.contrib.training.HParams(\n",
        "    train_test_split = 0.8,\n",
        "    train_batch_size = 100,\n",
        "    test_batch_size = 10,\n",
        "\n",
        "    dtype=np.float32,\n",
        "    init_raw_scale=np.log(np.expm1(1.)),  # approx= 0.5413\n",
        "    scale_diag_offset=1e-3,\n",
        "\n",
        "    surrogate_posterior_rank=1,\n",
        "\n",
        "    num_monte_carlo_draws=2,\n",
        "\n",
        "    train_iterations = int(3e3),\n",
        "\n",
        "    learning_rate_start = 1e-2,\n",
        "    learning_rate_num_epochs_per_decay = 10,\n",
        "    learning_rate_decay_factor = 0.99,\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "iJz56O8kGPsM"
      },
      "source": [
        "### Data Munging"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "InypzQj8KViU"
      },
      "source": [
        "We'll use `tf.data.Dataset` to feed the data into the TensorFlow graph. For a nice tutorial on different data loading patterns, see [\"How to use Dataset in TensorFlow\"](https://towardsdatascience.com/how-to-use-dataset-in-tensorflow-c758ef9e4428)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "zA_Lt3BO9vZa"
      },
      "outputs": [],
      "source": [
        "def dataset(df, batch_size):\n",
        "  with tf.compat.v1.name_scope(name='dataset'):\n",
        "    feature_cols=['county', 'floor']\n",
        "    label_cols=['log_radon']\n",
        "    dataset = tf.data.Dataset.from_tensor_slices((\n",
        "        df[feature_cols].values.astype(np.int32),\n",
        "        df[label_cols].values.astype(np.float32),\n",
        "    )).repeat().batch(batch_size)\n",
        "    iter_ = tf.data.Iterator.from_structure(\n",
        "        dataset.output_types, dataset.output_shapes)\n",
        "    init_op = iter_.make_initializer(dataset)\n",
        "    features, labels = iter_.get_next()\n",
        "    features.set_shape([batch_size, 2])\n",
        "    labels.set_shape([batch_size, 1])\n",
        "    return init_op, features, labels\n",
        "\n",
        "\n",
        "DataStats = collections.namedtuple(\n",
        "    'DataStats',\n",
        "    [\n",
        "        'num_train',\n",
        "        'num_test',\n",
        "        'num_unique_county',\n",
        "        'num_unique_floor',\n",
        "    ])\n",
        "\n",
        "\n",
        "def split_dataset(df, train_test_split, train_batch_size, test_batch_size):\n",
        "  \"\"\"Creates train/test split data.\"\"\"\n",
        "  with tf.compat.v1.name_scope(name='split_dataset'):\n",
        "    train_df = df.sample(frac=train_test_split, random_state=42)\n",
        "    test_df = df.drop(train_df.index)\n",
        "    data_stats = DataStats(\n",
        "        num_train=len(train_df),\n",
        "        num_test=len(test_df),\n",
        "        num_unique_county=1 + df['county'].max(),\n",
        "        num_unique_floor=1 + df['floor'].max(),\n",
        "    )\n",
        "    train_init_op, train_features, train_labels = dataset(\n",
        "        train_df,\n",
        "        train_batch_size)\n",
        "    test_init_op, test_features, test_labels = dataset(\n",
        "        test_df,\n",
        "        test_batch_size)\n",
        "    return [\n",
        "        tf.group([train_init_op, test_init_op]),  # dataset_init\n",
        "        train_features,\n",
        "        train_labels,\n",
        "        test_features,\n",
        "        test_labels,\n",
        "        data_stats,\n",
        "    ]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "ZWvgUUAbGgkc"
      },
      "source": [
        "### Specify Model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "rcl2AuF1GePi"
      },
      "outputs": [],
      "source": [
        "def make_prior():\n",
        "  def _fn():\n",
        "    dims = data_stats.num_unique_county\n",
        "    prior_raw_scale = tf.get_variable(\n",
        "        name='prior_raw_scale',\n",
        "        initializer=np.array(hparams.init_raw_scale, hparams.dtype))\n",
        "    scale = tf.nn.softplus(prior_raw_scale) + hparams.scale_diag_offset\n",
        "    return tfd.Independent(\n",
        "        tfd.Normal(loc=np.zeros(dims, hparams.dtype), scale=scale),\n",
        "        reinterpreted_batch_ndims=1,\n",
        "        name='prior')\n",
        "  return tf.make_template('make_prior', _fn)()\n",
        "\n",
        "\n",
        "def make_likelihood(x, u):\n",
        "  def _fn():\n",
        "    intercept = tf.get_variable(\n",
        "      name='intercept',\n",
        "      initializer=np.zeros(1, hparams.dtype))\n",
        "    weights_floor = tf.pad(\n",
        "        tf.get_variable(\n",
        "            name='weights_floor',\n",
        "            initializer=np.zeros(data_stats.num_unique_floor - 1,\n",
        "                                 hparams.dtype)),\n",
        "        paddings=[[1, 0]])\n",
        "    random_effect = tf.transpose(tf.gather(tf.transpose(u), x[:, 0]))\n",
        "    fixed_effect = intercept + tf.gather(weights_floor, x[:, 1])\n",
        "    predicted_linear_response = fixed_effect + random_effect\n",
        "    likelihood_raw_scale = tf.get_variable(\n",
        "        name='likelihood_raw_scale',\n",
        "        initializer=np.array(hparams.init_raw_scale, hparams.dtype))\n",
        "    scale = tf.nn.softplus(likelihood_raw_scale) + hparams.scale_diag_offset\n",
        "    return tfd.Independent(\n",
        "        tfd.Normal(loc=predicted_linear_response[..., tf.newaxis],\n",
        "                   scale=scale),\n",
        "        reinterpreted_batch_ndims=2,\n",
        "        name='likelihood')\n",
        "\n",
        "  return tf.make_template('make_likelihood', _fn)()\n",
        "\n",
        "\n",
        "def make_surrogate_posterior():\n",
        "  dims = data_stats.num_unique_county\n",
        "  def _tril():\n",
        "    loc = tf.get_variable(\n",
        "        name='surrogate_loc',\n",
        "        shape=[dims],\n",
        "        initializer=tf.zeros_initializer())\n",
        "    raw_scale_tril = tf.get_variable(\n",
        "        name='surrogate_raw_scale_tril',\n",
        "        initializer=np.zeros(dims * (dims + 1) // 2, hparams.dtype))\n",
        "    scale_tril = tfp.math.fill_triangular(raw_scale_tril)\n",
        "    new_diag = hparams.scale_diag_offset + tf.nn.softplus(\n",
        "        hparams.init_raw_scale + tf.diag_part(scale_tril))\n",
        "    scale_tril = tf.linalg.set_diag(scale_tril, new_diag)\n",
        "    return tfd.MultivariateNormalTriL(\n",
        "        loc=loc,\n",
        "        scale_tril=scale_tril,\n",
        "        name='surrogate_posterior')\n",
        "  def _lowrank():\n",
        "    rank = 1\n",
        "    loc = tf.get_variable(\n",
        "        name='surrogate_loc',\n",
        "        shape=[dims],\n",
        "        initializer=tf.zeros_initializer())\n",
        "    raw_scale = tf.get_variable(\n",
        "        name='surrogate_raw_scale',\n",
        "        initializer=np.zeros(dims * (1 + rank), hparams.dtype))\n",
        "    return tfd.MultivariateNormalDiagPlusLowRank(\n",
        "        loc=loc,\n",
        "        scale_diag=tf.nn.softplus(hparams.init_raw_scale + raw_scale[:dims]),\n",
        "        scale_perturb_factor=tf.reshape(raw_scale[dims:], [dims, rank]),\n",
        "        name='surrogate_posterior')\n",
        "  return tf.make_template(\n",
        "      'make_surrogate_posterior',\n",
        "      _tril if hparams.surrogate_posterior_rank \u003e= dims else _lowrank)()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "8cd1whNpMPwL"
      },
      "source": [
        "### Main"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 187
        },
        "colab_type": "code",
        "id": "85FS-MhiFHjF",
        "outputId": "08820d83-550b-4e65-d046-6148a403b010"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "tfp.distributions.Independent(\"make_prior/prior/\", batch_shape=(), event_shape=(85,), dtype=float32)\n",
            "tfp.distributions.MultivariateNormalDiagPlusLowRank(\"make_surrogate_posterior/surrogate_posterior/\", batch_shape=(), event_shape=(85,), dtype=float32)\n",
            "tfp.distributions.Independent(\"elbo_loss/expectation/make_likelihood/likelihood/\", batch_shape=(2,), event_shape=(100, 1), dtype=float32)\n",
            "Tensor(\"elbo_loss/expectation/Mean:0\", shape=(), dtype=float32)\n",
            "[\u003ctf.Variable 'make_prior/prior_raw_scale:0' shape=() dtype=float32_ref\u003e,\n",
            " \u003ctf.Variable 'make_surrogate_posterior/surrogate_loc:0' shape=(85,) dtype=float32_ref\u003e,\n",
            " \u003ctf.Variable 'make_surrogate_posterior/surrogate_raw_scale:0' shape=(170,) dtype=float32_ref\u003e,\n",
            " \u003ctf.Variable 'make_likelihood/intercept:0' shape=(1,) dtype=float32_ref\u003e,\n",
            " \u003ctf.Variable 'make_likelihood/weights_floor:0' shape=(1,) dtype=float32_ref\u003e,\n",
            " \u003ctf.Variable 'make_likelihood/likelihood_raw_scale:0' shape=() dtype=float32_ref\u003e]\n"
          ]
        }
      ],
      "source": [
        "reset_sess()\n",
        "\n",
        "[\n",
        "  data_init,\n",
        "  train_features,\n",
        "  train_labels,\n",
        "  test_features,\n",
        "  test_labels,\n",
        "  data_stats,\n",
        "] = split_dataset(\n",
        "    df,\n",
        "    hparams.train_test_split,\n",
        "    hparams.train_batch_size,\n",
        "    hparams.test_batch_size,\n",
        ")\n",
        "\n",
        "prior = make_prior()\n",
        "print(prior)\n",
        "\n",
        "surrogate_posterior = make_surrogate_posterior()\n",
        "print(surrogate_posterior)\n",
        "\n",
        "minibatch_correction_factor = data_stats.num_train / hparams.train_batch_size\n",
        "\n",
        "def unnormalized_approx_posterior_log_prob(u):\n",
        "  likelihood = make_likelihood(train_features, u)\n",
        "  print(likelihood)\n",
        "  return (likelihood.log_prob(train_labels) * minibatch_correction_factor\n",
        "          + prior.log_prob(u))\n",
        "\n",
        "elbo_loss = tfp.vi.monte_carlo_variational_loss(\n",
        "    p_log_prob=unnormalized_approx_posterior_log_prob,\n",
        "    q=surrogate_posterior,\n",
        "    discrepancy_fn=tfp.vi.kl_reverse,  # same as: Evidence Lower BOund\n",
        "    num_draws=hparams.num_monte_carlo_draws,\n",
        "    name='elbo_loss')\n",
        "print(elbo_loss)\n",
        "\n",
        "global_step = tf.train.get_or_create_global_step()\n",
        "learning_rate = tf.train.exponential_decay(\n",
        "    learning_rate=hparams.learning_rate_start,\n",
        "    global_step=global_step,\n",
        "    decay_steps=minibatch_correction_factor * hparams.learning_rate_num_epochs_per_decay,\n",
        "    decay_rate=hparams.learning_rate_decay_factor,\n",
        "    staircase=True)\n",
        "opt = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
        "train = opt.minimize(elbo_loss, global_step=global_step)\n",
        "\n",
        "pprint(tf.trainable_variables())\n",
        "\n",
        "var_init = tf.global_variables_initializer()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 289
        },
        "colab_type": "code",
        "id": "e9IaaqZPK9V8",
        "outputId": "8ba3ffa7-29b7-4089-e854-434fce3fb2ad"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "iter:   0  loss:1966.783\n",
            "iter: 200  loss:1020.058\n",
            "iter: 400  loss:833.788\n",
            "iter: 600  loss:994.871\n",
            "iter: 800  loss:883.134\n",
            "iter:1000  loss:892.679\n",
            "iter:1200  loss:846.151\n",
            "iter:1400  loss:857.963\n",
            "iter:1600  loss:902.009\n",
            "iter:1800  loss:893.753\n",
            "iter:2000  loss:814.118\n",
            "iter:2200  loss:841.195\n",
            "iter:2400  loss:906.226\n",
            "iter:2600  loss:881.371\n",
            "iter:2800  loss:839.190\n",
            "iter:2999  loss:832.338\n"
          ]
        }
      ],
      "source": [
        "loss_ = np.zeros(hparams.train_iterations)\n",
        "\n",
        "sess.run([var_init, data_init])\n",
        "\n",
        "for iter_ in range(hparams.train_iterations):\n",
        "  [\n",
        "      _,\n",
        "      train_features_,\n",
        "      train_labels_,\n",
        "      test_features_,\n",
        "      test_labels_,\n",
        "      loss_[iter_],\n",
        "  ] = sess.run([\n",
        "      train,\n",
        "      train_features,\n",
        "      train_labels,\n",
        "      test_features,\n",
        "      test_labels,\n",
        "      elbo_loss,\n",
        "  ])\n",
        "  if iter_ % 200 == 0 or iter_ == hparams.train_iterations - 1:\n",
        "    print(\"iter:{:\u003e4}  loss:{:.3f}\".format(\n",
        "        iter_, loss_[iter_]))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "6H7RVU-SXexC"
      },
      "source": [
        "### Results"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 68
        },
        "colab_type": "code",
        "id": "OmiHUfBDUZg4",
        "outputId": "9c99721d-fa5c-4b3c-acff-d78ae6fc62ba"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "    intercept:  [ 1.46341455]\n",
            "weights_floor:  [-0.71115714]\n",
            "  prior_scale:  0.333418\n"
          ]
        }
      ],
      "source": [
        "surrogate_posterior_cov = surrogate_posterior.covariance()\n",
        "surrogate_posterior_scale = tf.cholesky(surrogate_posterior_cov )\n",
        "\n",
        "with tf.variable_scope('make_likelihood', reuse=True):\n",
        "  intercept = tf.get_variable(name='intercept')\n",
        "  weights_floor = tf.get_variable(name='weights_floor')\n",
        "\n",
        "[\n",
        "    surrogate_posterior_scale_,\n",
        "    surrogate_posterior_cov_,\n",
        "    intercept_,\n",
        "    weights_floor_,\n",
        "    prior_scale_,\n",
        "] = sess.run([\n",
        "    surrogate_posterior_scale,\n",
        "    surrogate_posterior_cov,\n",
        "    intercept,\n",
        "    weights_floor,\n",
        "    prior.distribution.scale,\n",
        "])\n",
        "\n",
        "\n",
        "print('    intercept: ', intercept_)\n",
        "print('weights_floor: ', weights_floor_)\n",
        "print('  prior_scale: ', prior_scale_)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "eG8Z-HVwiz63"
      },
      "source": [
        "We will now plot the training-set loss as a function of training iteration. Note that although the `learning_rate` decays to `0`, there's still noise in the loss owing to the learned parameters being evaluated over different mini-batches."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 291
        },
        "colab_type": "code",
        "id": "qa63HEgPu2Zn",
        "outputId": "be9d43df-d94f-4513-d2ad-b090ce2a8c73"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae7f89150\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "plt.plot(loss_, 'b-');\n",
        "plt.xlabel('iter');\n",
        "plt.ylabel('loss');"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "WJHWXM33i_3o"
      },
      "source": [
        "We now plot a nonparametric estimate of the density of the diagonal of the surrogate posterior covariance. Roughly speaking, this shows us how much intrinsic variability there is in each county's `log(radon)` readings."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 291
        },
        "colab_type": "code",
        "id": "Pa47BzL0u2KA",
        "outputId": "c0a4dc47-b693-4bde-db0d-843c4adc80a7"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nUJq/wYQJE0hNTSUvL4+RI0fSsGFDatWqFbNMy5cvZ/fu3bzwwgtAfBynMzOBscfp2muv5dprr2Xl\nypXMnDmThx9+OKavvdLkiuXr78yzkqlTp/Lwww//7nFGvU+dL1NZjlNMzhAimdOoRo0aHDlyBChe\nR6GoqIjExERq1Khx2rZHjhyJaD4kPTK53W4SExOxWCwkJiYCkJGRQZ06dcjJySl3pkhzncvZjlX1\n6tUNzQSQmpoKQK1atWjdujV79uyJWabvv/+eL774gszMTCyW4s8/Rh+ns2UCY4/TSV27dg2fnej1\n2itvLr1efxfK5Ha72bdvHy+88AIPP/wwP/74I6+99hq7d+827H3qfJnKcpxiUhAimdOoY8eOLFu2\nDIDVq1fTpk0bADp16sSqVasIBALk5eWRm5tLkyZNDM2Un59PKBQC4ODBg+Tm5lK7du1yZ4o016lO\n/WTSrl07srOzKSoqoqCggOzs7Kjc6VCeTIWFhQQCAaD4uP3www/Uj8Kat5Fk2rNnD++//z5PP/00\nSUlJ4e8beZzOlcnI45Sbmxv+94YNG6hbsrqYXq+98ubS6/V3oUwul4sPPviAsWPHMm7cOJo1a0Zm\nZiYZGRmGvU+dL1NZjlPMpq4425xGM2bMoHHjxnTs2BG/388777zD3r17SUpK4vHHHw+fLs+ePZsl\nS5ZgsViifjtXWTJ99913zJgxA7PZjMlkYsCAAWftv9Mr165du3jjjTcoLCzEarWSmprKmDFjgOLb\nKWfNmoWmaVG/nbIsmX788Ufee+89TCYTSin69etHr169YpLpxRdfZN++fVSrVu13t3IadZzOlcnI\n4zRlyhSys7OxWCwkJCQwZMiQcDHS67VXnlx6vv4ulOlUI0eO5O677z7ttlMj3qfOlaksx0nmMhJC\nCAHISGUhhBAlpCAIIYQApCAIIYQoIQVBCCEEIAVBCCFECSkIQgghACkIwkDbtm3j+++/L/P2M2bM\nYPXq1VFMdLr58+eTn59/zp9/9tlnTJs2rdT7HT9+PAsWLChzrt27d/POO+9c8HF79+793fHJzMzE\n7/eXuW1RuUlBEIbZunUrmzdvLtO2oVCIAQMGcPnll5d6u0h99dVX5y0IRsnIyODRRx+94OPOVhBG\njx79uxkxhTjJsMntRMU0cOBAbr/9dr7//nsKCgq48847w4vhbNq0ienTpxMKhUhOTub+++8Pz58y\n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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae7f89850\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "surrogate_posterior_diag_scale_ = np.diag(surrogate_posterior_scale_)\n",
        "with warnings.catch_warnings():\n",
        "  warnings.simplefilter(\"ignore\")\n",
        "  sns.kdeplot(surrogate_posterior_diag_scale_, shade=True, color=\"r\");\n",
        "  plt.xlabel('posterior std. deviation');\n",
        "  plt.ylabel('density');"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "L9WYd1WxjQ2u"
      },
      "source": [
        "We now show a heat map of the covariance matrix. This shows us that just looking at the diagonal was a perfectly reasonable thing to do; the matrix is clearly [diagonally dominant](https://en.wikipedia.org/wiki/Diagonally_dominant_matrix)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 306
        },
        "colab_type": "code",
        "id": "-etGwnAHu2Br",
        "outputId": "d45db3fa-94f9-406f-e9ad-a6b4a1a0a56f"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "\u003cmatplotlib.text.Text at 0x7f9ae4c3ec90\u003e"
            ]
          },
          "execution_count": 0,
          "metadata": {
            "tags": []
          },
          "output_type": "execute_result"
        },
        {
          "data": {
            "image/png": "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\n/wAEh4dpDrGawQAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae50636d0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "sns.heatmap(surrogate_posterior_cov_)\n",
        "plt.title('Surrogate Posterior Covariance')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "unU7DMKVjel7"
      },
      "source": [
        "We now conjecture that the county-wise standard deviations might be log-correlated with the number of observations for that county."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 291
        },
        "colab_type": "code",
        "id": "PqpaImuYu14c",
        "outputId": "faea9de6-6bed-4971-b5e3-83aad474cef3"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cmatplotlib.figure.Figure at 0x7f9ae4add790\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "cnt = np.histogram(\n",
        "    df['county'],\n",
        "    np.arange(data_stats.num_unique_county+1))[0]\n",
        "\n",
        "y = np.stack([cnt, surrogate_posterior_diag_scale_]).T\n",
        "y = y[y[:,0].argsort()]  # sort by zero-th col\n",
        "sns.regplot(x=np.log(y[:,0]), y=y[:, 1], color='g')\n",
        "plt.xlabel('county log-count');\n",
        "plt.ylabel('posterior std. deviation');"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "JYJL76jkcFjl"
      },
      "source": [
        "Indeed--we do appear to have learned a log-linear relationship between std. deviation and county frequency. This is neat because we never expressed this idea in the model; it is simply apparently true."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "AxhvAIeFs2cL"
      },
      "source": [
        "## Comparing to `lme4` in R"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 17
        },
        "colab_type": "code",
        "id": "hvRDd7T-s7qY",
        "outputId": "148be309-259f-4ce0-b244-0e935714ffd7"
      },
      "outputs": [
        {
          "data": {
            "application/javascript": [
              "window[\"233734b6-d339-11e8-9731-705a0f466c11\"] = colab.output.setWordWrap(true);\n",
              "//# sourceURL=js_bab784b33f"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae4af75d0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734b7-d339-11e8-9731-705a0f466c11\"] = jQuery(\"\u003cdiv class=id_794834720 style=\\\"margin-right:10px; display:flex;align-items:center;margin-top:10px;\\\"\u003e\u003cspan style=\\\"margin-right: 3px;\\\"\u003e\u003c/span\u003e\u003c/div\u003e\");\n",
              "//# sourceURL=js_9837565a48"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae4af70d0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734b8-d339-11e8-9731-705a0f466c11\"] = jQuery(\"#output-footer\");\n",
              "//# sourceURL=js_10f14ea08c"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae4af7090\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734b9-d339-11e8-9731-705a0f466c11\"] = window[\"233734b7-d339-11e8-9731-705a0f466c11\"].appendTo(window[\"233734b8-d339-11e8-9731-705a0f466c11\"]);\n",
              "//# sourceURL=js_ca34337bf1"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae7b59850\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734ba-d339-11e8-9731-705a0f466c11\"] = jQuery(\".id_794834720 span\");\n",
              "//# sourceURL=js_160caf1f8a"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae4af73d0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734bb-d339-11e8-9731-705a0f466c11\"] = window[\"233734ba-d339-11e8-9731-705a0f466c11\"].text(\"\u003e\");\n",
              "//# sourceURL=js_dabcd62bdd"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae4af7410\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734bd-d339-11e8-9731-705a0f466c11\"] = jQuery(\".id_794834720\");\n",
              "//# sourceURL=js_c662bff62a"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae7b59310\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        },
        {
          "data": {
            "application/javascript": [
              "window[\"233734be-d339-11e8-9731-705a0f466c11\"] = window[\"233734bd-d339-11e8-9731-705a0f466c11\"].remove();\n",
              "//# sourceURL=js_a7ead95b84"
            ],
            "text/plain": [
              "\u003cIPython.core.display.Javascript at 0x7f9ae7b598d0\u003e"
            ]
          },
          "metadata": {
            "tags": []
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "%%shell\n",
        "exit  # Trick to make this block not execute.\n",
        "\n",
        "radon = read.csv('srrs2.dat', header = TRUE)\n",
        "radon = radon[radon$state=='MN',]\n",
        "radon$radon = ifelse(radon$activity==0., 0.1, radon$activity)\n",
        "radon$log_radon = log(radon$radon)\n",
        "\n",
        "# install.packages('lme4')\n",
        "library(lme4)\n",
        "fit \u003c- lmer(log_radon ~ 1 + floor + (1 | county), data=radon)\n",
        "fit\n",
        "\n",
        "# Linear mixed model fit by REML ['lmerMod']\n",
        "# Formula: log_radon ~ 1 + floor + (1 | county)\n",
        "#    Data: radon\n",
        "# REML criterion at convergence: 2171.305\n",
        "# Random effects:\n",
        "#  Groups   Name        Std.Dev.\n",
        "#  county   (Intercept) 0.3282\n",
        "#  Residual             0.7556\n",
        "# Number of obs: 919, groups:  county, 85\n",
        "# Fixed Effects:\n",
        "# (Intercept)        floor\n",
        "#       1.462       -0.693"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "n5IqiHERv91u"
      },
      "source": [
        "The following table summarizes the results."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 0,
      "metadata": {
        "colab": {
          "height": 68
        },
        "colab_type": "code",
        "id": "D0sUh3NNuqlw",
        "outputId": "f0876c02-0822-464a-ee44-e1d53e94dea1"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "         floor  intercept     scale\n",
            "lme4 -0.693000   1.462000  0.328200\n",
            "vi   -0.711157   1.463415  0.333418\n"
          ]
        }
      ],
      "source": [
        "print(pd.DataFrame(data=dict(intercept=[1.462, intercept_[0]],\n",
        "                             floor=[-0.693, weights_floor_[0]],\n",
        "                             scale=[0.3282, prior_scale_]),\n",
        "                   index=['lme4', 'vi']))"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "nVjHJxVdwBXb"
      },
      "source": [
        "This table indicates the VI results are within ~10% of `lme4`'s.  This is somewhat surprising since:\n",
        "- `lme4` is based on [Laplace's method](https://www.jstatsoft.org/article/view/v067i01/) (not VI),\n",
        "- we used mini-batch SGD,\n",
        "- no effort was made in this colab to actually converge,\n",
        "- minimal effort was made to tune hyperparameters,\n",
        "- no effort was taken regularize or preprocess the data (eg, center features, etc.)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "ApP0PtwYN_ah"
      },
      "source": [
        "## Conclusion"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "eIFHW00tOJwo"
      },
      "source": [
        "In this colab we described Generalized Linear Mixed-effects Models and showed how to use variational inference to fit them using TensorFlow. Although the toy problem only had a few 100 training samples, the techniques used here are identical to what's needed at scale."
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "Linear Mixed Effects Model Variational Inference",
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
